#ifndef __DEVICE_H
#define __DEVICE_H
#include "stdint.h"
#include "string.h"
#include "stdbool.h"
#include "list.h" 
/*
__attribute__((used,__section__(".fn_cmd."level)))中used的意思。
unused：表示该函数或变量可能不使用，这个属性可以避免编译器产生警告信息。
used： 向编译器说明这段代码有用，即使在没有用到的情况下编译器也不会警告。
*/
typedef int (*auto_init)(void);
#define AUTO_SECTION(level) __attribute__((used, __section__(".fn_cmd." level)))
#define BOARD_START_EXPORT(func) const auto_init cmd_fn_##func AUTO_SECTION("0.end") = func
#define BOARD_END_EXPORT(func) const auto_init cmd_fn_##func AUTO_SECTION("1.end") = func
#define BSP_END_EXPORT(func) const auto_init cmd_fn_##func AUTO_SECTION("2.end") = func
#define APP_END_EXPORT(func) const auto_init cmd_fn_##func AUTO_SECTION("3.end") = func
// 主板初始化
#define BOARD_INIT(func) const auto_init cmd_fn_##func AUTO_SECTION("1") = func
// 外设初始化
#define BSP_INIT(func) const auto_init cmd_fn_##func AUTO_SECTION("2") = func
// 应用初始化
#define APP_INIT(func) const auto_init cmd_fn_##func AUTO_SECTION("3") = func


extern void Sys_AutoInit(void); // 自动初始化
#define NAME_MAXLEN 30
typedef struct _device device;
struct _device
{
    char name[NAME_MAXLEN];
    int (*init)(device *dev);
    int (*open)(device *dev, int flag);
    int (*close)(device *dev);
    int (*contorl)(device *dev, int cmd, void *args);
    int (*read)(device *dev, int offest, void *buf, int len);
    int (*write)(device *dev, int offest, const void *buf, int len);

    void *args;
    uint8_t init_flag;
	int flag;
    list device_list;
};
typedef struct object *obj;

extern device *device_find(char *name);
extern int register_device(device *dev);
extern int delete_device(device *dev);
extern int Get_device_num(void);

extern int device_init(device *dev);
extern int device_open(device *dev, int flag);
extern int device_close(device *dev);
extern int device_contorl(device *dev, uint8_t cmd, void *args);
extern int device_read(device *dev, int offest, uint8_t *buf, int len);
extern int device_write(device *dev, int offest, uint8_t *buf, int len);

extern int list_dev_init(void);

int board_Init(void);
int bsp_Init(void);
int app_Init(void);
#endif
